﻿// Пример использования индексаторов и свойств
// Показано создание класса для поддержки массивов с произвольным диапазоном индексации

using System;

class IndexersAndPropertiesDemo
{
    public static void Main()
    {
        RangeArray ra = new RangeArray(-5, 5);
        for (int i = 0; i < ra.Length; i++)
        {
            ra[ra.LowRange + i] = i*2;
        }

        for (int i = ra.LowRange; i <= ra.HighRange; i++)
        {
            Console.WriteLine("Значение ra[{0}] равно {1}", i, ra[i]);
        }
        Console.WriteLine(ra[-1]);

        Console.ReadLine();
    }
}

class RangeArray
{
    int lowRange;
    int highRange;
    int length;
    int[] arr;
    bool err;

    public RangeArray(int low, int high)
    {
        high++;
        if (low > high) // При max < min создаем минимальный массив
        {
            low = 0;
            high = 1;
        }
        arr = new int[high - low];
        length = high - low;

        lowRange = low;
        highRange = --high;
    }

    // Свойства
    public bool Error
    {
        get
        {
            return err;
        }
    }

    public int Length
    {
        get
        {
            return length;
        }
    }

    public int LowRange
    {
        get
        {
            return lowRange;
        }
    }

    public int HighRange
    {
        get
        {
            return highRange;
        }
    }

    // Функция проверки вхождения индекса в массив
    private bool isOK(int index)
    {
        if ((index >= lowRange) && (index <= highRange))
            return true;
        else return false;
    }

    // Индексатор
    public int this[int index]
    {
        get
        {
            if (isOK(index))
            {
                err = false;
                return arr[index - lowRange];
            }
            else
            {
                err = true;
                return 0;
            }
        }
        set
        {
            if (isOK(index))
            {
                err = false;
                arr[index - lowRange] = value;
            }
            else
            {
                err = true;
                value = 0;
            }
        }
    }


}